import java.io.File;

/**
 * 文件加密解密演示类
 * 用于测试FileEncryptionUtil的各种加密解密方法
 */
public class FileEncryptionDemo {

    public static void main(String[] args) {
        // 测试文件路径
        String originalFilePath = "d:\\gongtan\\proj\\beihang\\test.txt";
        String encryptedFilePath = "d:\\gongtan\\proj\\beihang\\test_encrypted.dat";
        String decryptedFilePath = "d:\\gongtan\\proj\\beihang\\test_decrypted.txt";
        
        // 加密密钥
        String key = "MySecretKey12345";
        
        // 创建测试文件（如果不存在）
        createTestFile(originalFilePath);
        
        System.out.println("=== 文件加密解密演示 ===");
        System.out.println("原始文件: " + originalFilePath);
        System.out.println("加密文件: " + encryptedFilePath);
        System.out.println("解密文件: " + decryptedFilePath);
        System.out.println("加密密钥: " + key);
        System.out.println();
        
        // 1. 使用CipherOutputStream方式加密和解密
        System.out.println("=== 方法1: 使用CipherOutputStream方式 ===");
        boolean encryptResult = FileEncryptionUtil.encryptFile(originalFilePath, encryptedFilePath, key);
        if (encryptResult) {
            FileEncryptionUtil.decryptFile(encryptedFilePath, decryptedFilePath, key);
        }
        System.out.println();
        
        // 2. 使用Cipher直接处理方式加密和解密（适用于小文件）
        System.out.println("=== 方法2: 使用Cipher直接处理方式（适用于小文件） ===");
        encryptResult = FileEncryptionUtil.encryptFileWithCipher(originalFilePath, encryptedFilePath, key);
        if (encryptResult) {
            FileEncryptionUtil.decryptFileWithCipher(encryptedFilePath, decryptedFilePath, key);
        }
        System.out.println();
        
        // 3. 使用Cipher.update方式加密和解密（适用于大文件）
        System.out.println("=== 方法3: 使用Cipher.update方式（适用于大文件） ===");
        encryptResult = FileEncryptionUtil.encryptLargeFile(originalFilePath, encryptedFilePath, key);
        if (encryptResult) {
            FileEncryptionUtil.decryptLargeFile(encryptedFilePath, decryptedFilePath, key);
        }
        System.out.println();
        
        System.out.println("演示完成，请检查生成的文件。");
    }
    
    /**
     * 创建测试文件
     * 
     * @param filePath 文件路径
     */
    private static void createTestFile(String filePath) {
        File file = new File(filePath);
        if (!file.exists()) {
            try {
                // 确保父目录存在
                File parent = file.getParentFile();
                if (!parent.exists()) {
                    parent.mkdirs();
                }
                
                // 创建测试文件并写入内容
                java.io.FileWriter writer = new java.io.FileWriter(file);
                writer.write("这是一个测试文件，用于演示Java文件加密和解密功能。\n");
                writer.write("This is a test file for demonstrating Java file encryption and decryption.\n");
                writer.write("文件加密使用AES算法，是一种对称加密算法。\n");
                writer.write("对称加密算法使用相同的密钥进行加密和解密。\n");
                writer.write("=== 以下是随机内容 ===\n");
                
                // 添加一些随机内容
                for (int i = 1; i <= 10; i++) {
                    writer.write("随机行 " + i + ": " + java.util.UUID.randomUUID().toString() + "\n");
                }
                
                writer.close();
                System.out.println("已创建测试文件: " + filePath);
            } catch (Exception e) {
                System.out.println("创建测试文件失败: " + e.getMessage());
            }
        }
    }
}